package org.example.logindemo.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.example.logindemo.entity.User;
import org.example.logindemo.service.UserService;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
/*
    HttpSession (会话)：
        * HttpSession是Servlet API中用来跟踪和管理Web应用中用户会话的对象。
        何时创建和销毁：
            * 创建：服务器端第一次调用getSession()方法时
            * 销毁：
                1.Session过期，默认的过期时间为30分钟(D:\86151\tomCat\apache-tomcat-10.1.28\conf\web.xml)
                2.非正常关闭服务器（正常关闭服务器会进行session序列化）
                3.手动调用session.invalidate()
        * 如何存取数据：
            * 存：void setAttribute(String key,Object value)
            * 取：Object getAttribute(String key)
        * 作用范围：
            * 一次会话的范围（多次请求）

 */

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    // 创建UserService对象
    private UserService userService = new UserService();

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 1. 获取参数 2. 验证用户 3. 返回结果
         */
        /**
         * 1.获取参数
         * request.getParameter("userName");这里面的参数username就是前端<input>标签中的name,切勿写错
         */
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String checkNum = request.getParameter("checkNum");
        String remoteAddr = request.getRemoteAddr();
        System.out.println(remoteAddr);
        // 调用userService对象中的login方法验证登录用户
        User user = userService.login(username,password);
        if(user == null){
            System.out.println("未找到此人");
        }
        String checkNumTarget = String.valueOf(request.getSession().getAttribute("checkNum"));

        if (user != null  && checkNum.equals(checkNumTarget)) {
            // 用户不为空，代表用户存在，并且验证码正确填写，成功登录
            System.out.println("登录成功");
            /*
             * 创建一个session用来存储user
             * session是javaweb中一个负责存储数据的，相当于你的钥匙包，此时的user便是其中的一个钥匙，
             * 将user存入包内，需要的时候在取出来（比如根据不同的登录者处理不同的逻辑），在前端jsp页面非常好用
             * */
            HttpSession session = request.getSession();
            //保存登录成功的用户信息
            session.setAttribute("user", user);
            //创建登录成功"凭证"防止用户跳过登录
            session.setAttribute("loginSuccess",true);
            // 登录成功后，通过转发跳转到新的界面，当然也可以使用重定向，我们这里为了简单采用转发,若是想转发其他界面只要修改loginSuccess.jsp即可
            request.getRequestDispatcher("loginSuccess.jsp").forward(request, response);// 转发
        } else {
            // user为空，代表用户不存在
            System.out.println("登陆失败");
            // 登录失败通过转发，在回到登录界面继续进行登录
            request.setAttribute("loginError","抱歉！登陆失败请重新登录");
            request.getRequestDispatcher("login.jsp").forward(request, response);// 转发
        }
    }
}
